/* 
 * Copyright (c) 2007, Andrey Shchekin

 * All rights reserved.

 * Redistribution and use in source and binary forms, with or without modification, are permitted provided 
 * that the following conditions are met:
 *    Redistributions of source code must retain the above copyright notice, this list of conditions and
 * the following disclaimer.
 *    Redistributions in binary form must reproduce the above copyright notice, this list of conditions and
 * the following disclaimer in the documentation and/or other materials provided with the distribution.
 *    Neither the name of the Andrey Shchekin nor the names of other contributors may be used to endorse or 
 * promote products derived from this software without specific prior written permission.

 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;

using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;

namespace AshMind.ProjectTypes.SqlProject.Tasks
{
    public class SqlCombine : Task
    {
        private string m_textBeforeFile;
        private ITaskItem[] m_files;
        private ITaskItem m_output;

        public override bool Execute()
        {
            using (StreamWriter writer = new StreamWriter(this.Output.ItemSpec))
            {
                this.AppendFiles(writer);
            }

            return true;
        }

        private void AppendFiles(StreamWriter writer)
        {
            foreach (ITaskItem file in this.Files)
            {
                this.AppendFile(writer, file); 
            }
        }

        private void AppendFile(StreamWriter writer, ITaskItem file)
        {
            string textBefore = this.TextBeforeFile;
            if (!string.IsNullOrEmpty(textBefore))
            {
                textBefore = Expand.Metadata(textBefore, file);
                writer.WriteLine(textBefore);
            }

            using (StreamReader reader = new StreamReader(file.ItemSpec))
            {
                string line = reader.ReadLine();
                while (line != null)
                {
                    writer.WriteLine(line);
                    line = reader.ReadLine();
                }
            }
        }

        [Required]
        public ITaskItem[] Files
        {
            get { return m_files; }
            set { m_files = value; }
        }

        /// <summary>
        /// Text to be inserted before each file.
        /// Supports file metadata references with %().
        /// </summary>
        public string TextBeforeFile
        {
            get { return m_textBeforeFile; }
            set { m_textBeforeFile = value; }
        }

        [Required]
        public ITaskItem Output
        {
            get { return m_output; }
            set { m_output = value; }
        }	
    }
}
